package fr.template.www.presentation.managedbean;

import fr.template.www.facade.Catalogue;
import fr.template.www.facade.Categorie;
import fr.template.www.facade.ExceptionCatalogue_Exception;
import fr.template.www.facade.ExceptionCategorie_Exception;
import fr.template.www.facade.ExceptionSiteInconnu_Exception;
import fr.template.www.facade.Produit;
import fr.template.www.facade.ProduitDto;
import fr.template.www.facade.WsFacade;
import fr.template.www.facade.WsFacade_Service;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.xml.ws.WebServiceRef;

/**
 * Bean permettant la gestion du catalogue du site
 * @author Sylvain
 */
@ManagedBean(name = "mbCatalogue")
@SessionScoped
public final class CatalogueManagedBean implements Serializable {

    @WebServiceRef(wsdlLocation = "WEB-INF/wsdl/localhost_8080/WsFacade/WsFacade.wsdl")
    private WsFacade_Service service;
    private static final long serialVersionUID = -5934549250579417056L;
        
    @ManagedProperty(value="#{mbSiteProperties}")
    private SitePropertiesBean siteProperties;
    
    private Catalogue catalogue ;
    private Categorie categorieSelectionne;
    private ProduitDto produitDtoSelectionne;
    
    // =================================================  //
    //                      METHODES                      //
    // =================================================  //

    /**
     * Permet la construction du catalogue
     * @return catalogue
     * @throws ExceptionSiteInconnu_Exception 
     */
    public String appelCatalogue() throws ExceptionSiteInconnu_Exception {
        if (catalogue == null){
        catalogue = creationCatalogue(SitePropertiesBean.chargeProperties());
        }
        return "";
    }

    /**
     * Permet de rediriger le site afin d'afficher 
     * la liste des produits dans la page centrale
     */
    public String afficherProduitsParCategorie(Categorie categorie) {
        setCategorieSelectionne(categorie);
        siteProperties.setPageCentrale("includes/gridProduits.xhtml");
        return "";
    }
    
    /**
     * permet de construire le catalogue
     * @param site nom du site consommateur
     * @return catalogue
     */
    private Catalogue creationCatalogue(final String site) {
        WsFacade port = service.getWsFacadePort();
            try {
                return port.creationCatalogue(site);
            } catch (    ExceptionCatalogue_Exception 
                    | ExceptionCategorie_Exception 
                    | ExceptionSiteInconnu_Exception ex) {
                Logger.getLogger(CatalogueManagedBean.class.getName()).log(Level.SEVERE, null, ex);
            }
        return new Catalogue();
    }

    
    // =================================================  //
    //                    GETTER - SETTER                 //
    // =================================================  //

    /**
     * Obtient la liste des catégories
     * @return catalogue retourne une catalogue
     */
    public List<Categorie> getCategories() throws ExceptionSiteInconnu_Exception {
        List<Categorie> listeCategorie = new ArrayList<>();
        if (catalogue==null) {
            appelCatalogue();
        }
        for (Categorie categorie : catalogue.getCategorie()) {
            if (categorie.getCount() != 0) {
                listeCategorie.add(categorie);
            }
        }
        return listeCategorie;
    }

    /**
     * Obtient la liste des produits pour une categorie selectionne
     * @return liste de produits
     */
    public List<Produit> getProduits(){
        return categorieSelectionne.getListeProd();
    }
    
    /**
     * Obtient la catégorie selectionne
     * @return 
     */
    public Categorie getCategorieSelectionne() {
       return categorieSelectionne;
    }

    /**
     * Defini la categorie selectionne
     * @param categorieSelectionne categorie
     */
    public void setCategorieSelectionne(final Categorie categorieSelectionne) {
        this.categorieSelectionne = categorieSelectionne;
    }

    /**
     * Obtient les proprietes du site
     * @return 
     */
    public SitePropertiesBean getSiteProperties() {
        return siteProperties;
    }

    /**
     * Defini les proprietes du site
     * @param siteProperties 
     */
    public void setSiteProperties(SitePropertiesBean siteProperties) {
        this.siteProperties = siteProperties;
    }

    /**
     * Obtient le catalogue
     * @return catalogue
     */
    public Catalogue getCatalogue() {
        return catalogue;
    }

    /**
     * defini le catalogue
     * @param catalogue 
     */
    public void setCatalogue(Catalogue catalogue) {
        this.catalogue = catalogue;
    }
    
    /**
     * Obtient le produit selectionne
     * @return produit
     */
    public ProduitDto getProduitDtoSelectionne() {
        return produitDtoSelectionne;
    }

    /**
     * Definit le produit selectionne
     * @param produitDto produit
     */
    public void setProduitDtoSelectionne(ProduitDto produitDto) {
        this.produitDtoSelectionne = produitDto;
    }
}
